#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File   : yield_learn.py
# @Email  : xuexia_xu@feidee.com
# @Time   : 2024/4/24 9:48
# @Desc   : yield使用

# 1.使用yield创建生成器
# 在python中，生成器是一种可迭代对象，但可迭代对象不一定是生成器。
# 一个list对象所有的值都是放在内存中的，如果数据量非常大的话，内存就有可能不够用；这种情况下，就可以生成器
# for i in list(range(3)):
#     print(i)
#
# # python可以用“（）”构建生成器对象
# b = (x for x in range(3))
# print(type(b))
# for i in b:
#     print(i)
# for i in b:
#     """生成器可以迭代的，并且数据实时生成，不会全部保存在内存中；
#     值得注意的是，生成器只能读取一次，第二次for循环输出的结果为空。"""
#     print(i)


# 单个yield
def get_generator():
    for i in range(3):
        print('gen ', i)
        m = yield i
        print("m:", m)


# 当调用get_generator函数时，并不会执行函数内部的代码，而是返回了一个迭代器对象，
# 1.使用for循环获取返回值
c = get_generator()
# for i in c:
#     print(i)

# 2.使用next循环获取返回值
# c1 = get_generator()
# print("next(c1):", next(c1))
# print("next(c1):", next(c1))

# 3.使用send循环获取返回值
c2 = get_generator()
print("-----send-------")
print("c2.send(None)", c2.send(None))
print("c2.send(100)", c2.send(100))
print("c2.send(200)", c2.send(200))

print("-----------")


# 多个yield
def multi_yield():
    print('study yield')
    m1 = yield 5
    print(m1)
    yield 16
    print('go on!')


m_c = multi_yield()
# next()被调用后，h()开始执行，直到遇到yield 5
d1 = next(m_c)  # study yield
# 当我们再次调用next()时，会继续执行，直到找到下一个yield。如果后面没有yield了，会拋出异常
# d2 = next(m_c)
d2 = m_c.send('Fighting')
print('My birthday:', d1, '.', d2)
